home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / scheme / schematk / src_1152.lha / Agent.subproj / PrefAgent.m < prev    next >
Encoding:
Text File  |  1992-03-11  |  31.8 KB  |  962 lines

  1. /* Copyright รก 1991 Gustavus Adolphus College.  All rights reserved.
  2.  *
  3.  * Schematik was developed by Gustavus Adolphus College (GAC) with
  4.  * support from NeXT Computer, Inc.  Permission to copy this software,
  5.  * to redistribute it, and to use it for any purpose is granted,
  6.  * subject to the following restrictions and understandings.
  7.  *
  8.  * 1. Any copy made of this software must include this copyright
  9.  * notice in full.
  10.  *
  11.  * 2. Users of this software agree to make their best efforts (a) to
  12.  * return to the GAC Mathematics and Computer Science Department any
  13.  * improvements or extensions that they make, so that these may be
  14.  * included in future releases; and (b) to inform GAC of noteworthy
  15.  * uses of this software.
  16.  *
  17.  * 3. All materials developed as a consequence of the use of this
  18.  * software shall duly acknowledge such use, in accordance with the
  19.  * usual standards of acknowledging credit in academic research.
  20.  *
  21.  * 4. GAC makes no express or implied warranty or representation of
  22.  * any kind with respect to this software, including any warranty
  23.  * that the operation of this software will be error-free.  ANY
  24.  * IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
  25.  * PURPOSE IS HEREBY DISCLAIMED.  GAC is under no obligation to
  26.  * provide any services, by way of maintenance, update, or otherwise.
  27.  *
  28.  * 5. In conjunction with products arising from the use of this
  29.  * material, there shall be no use of the name of Gustavus Adolphus
  30.  * College nor of any adaptation thereof in any advertising,
  31.  * promotional, or sales literature without prior written consent
  32.  * from GAC in each case.
  33.  */
  34.  
  35. #import "PrefAgent.h"
  36. #import "../defines.h"
  37. #import Main_h
  38. #import <appkit/ButtonCell.h>
  39. #import <appkit/Form.h>
  40. #import <appkit/NXBrowser.h>
  41. #import <appkit/NXBrowserCell.h>
  42. #import <appkit/NXImage.h>
  43. #import <appkit/Text.h>
  44. #import <appkit/defaults.h>
  45. #import <objc/List.h>
  46. #import <objc/NXStringTable.h>
  47. #import <sys/fcntl.h>
  48. #import <libc.h>
  49. #import <mach.h>
  50.  
  51. #define GetBOOLValue(x)    (NXOrderStrings((unsigned char *)defaults[x].value, (unsigned char *)"YES", YES, -1, NULL)?NO:YES)
  52.  
  53. #define NIBFILE        "Preferences.nib"
  54. #define BUTTONTIFF    "Pref"
  55. #define BUTTONTIFFH    "PrefH"
  56. #define TIFFWIDTH    64
  57. #define PREFZONENAME    "PrefAgnt"
  58. #define NATIVE_LANGUAGE    "English"
  59. #define LANGUAGEDIR    "%s/%s.lproj/%s"
  60. #define LANGUAGESTRINGS    "%s/%s.lproj/%s.strings"
  61. #define LANGUAGETIFFS    "%s/%s.lproj/%s.tiff"
  62. #define NUMBOXWINDOWS    4
  63. #define REVERTBUTTON    0
  64. #define CLOSEBUTTON    1
  65. #define OKBUTTON    2
  66. #define PREFABEXEC    "%s/kernel/scheme"
  67. #define PREFABPARAMS    "-emacs -library %s/kernel/library %s %s"
  68. #define SICPBAND    "-band sicp.com"
  69. #define MITCOMPILER    "-compiler"
  70.  
  71. #define FORMTBL    "{begin,0}{call-with-input-file,1}{call-with-output-file,1}{case,1}{define,1}{define-integrable,1}{define-macro,1}{define-structure,1}{define-syntax,1}{delay,0}{do,2}{fluid-let,1}{in-package,1}{lambda,1}{let,1}{let*,1}{letrec,1}{let-syntax,1}{list-search-negative,1}{list-search-positive,1}{list-transform-negative,1}{list-transform-positive,1}{local-declare,1}{macro,1}{make-environment,0}{named-lambda,1}{pathname-components,1}{sequence,0}{syntax-table-define,2}{using-syntax,1}{with-input-from-file,1}{with-input-from-string,1}{with-output-to-file,1}{with-output-to-port,1}{with-output-to-string,0}{with-values,1}"
  72.  
  73. #define DEFLTS    {{"App_ConfirmOnClose","YES"}, {"App_ConfirmOnQuit","YES"}, {"App_ErrorAbort","1"}, {"Document_Offset","{20.0,-20.0}"}, {"Document_Pos","{280.0,70.0}"}, {"Interaction_Autoscroll","YES"}, {"Interaction_CommentOutput","NO"}, {"Interaction_EvaluateAll","NO"}, {"Interaction_Font","Ohlfs"}, {"Interaction_FontSize","11.0"}, {"Interaction_InsertErrors","YES"}, {"Interaction_Frame","{{240.0,400.0},{560.0,400.0}}"}, {"Scheme_Dialect","0"}, {"Scheme_Executable","/usr/local/bin/scheme"}, {"Scheme_Parameters","-emacs"}, {"Scheme_SICPParameters"," "}, {"Scheme_MITParameters"," "}, {"Scheme_SpecialForms", FORMTBL}, {"Text_Autoindent","YES"}, {"Text_DoubleClickMatch","YES"}, {"Text_FormatAfterPaste","YES"}, {"Text_MatchParenthesis","YES"}, {"Interaction_Transcript","NO"}, {"Text_ReverseVideo","NO"}, {"App_UseSpecialCursors","NO"}, {"Graphics_Size","{400.0,300.0}"}, {"Graphics_SizeTolerance","{112.0,90.0}"}, {"App_KeepBackupCopy","YES"}, {NULL,NULL}}
  74.  
  75. #define CONFIRMONCLOSE    0
  76. #define CONFIRMONQUIT    1
  77. #define ERRORABORT    2
  78. #define DOCOFFSET    3
  79. #define DOCPOS        4
  80. #define AUTOSCROLL    5
  81. #define COMMENTOUTPUT    6
  82. #define EVALUATEALL    7
  83. #define INTERFONT    8
  84. #define INTERFONTSIZE    9
  85. #define INSERTERRORS    10
  86. #define INTERFRAME    11
  87. #define SCHEMEDIALECT    12
  88. #define EXECUTABLE    13
  89. #define PARAMETERS    14
  90. #define SICPPARAMETERS    15
  91. #define MITPARAMETERS    16
  92. #define SPECIALFORMS    17
  93. #define AUTOINDENT    18
  94. #define DBLCLICKMATCH    19
  95. #define FRMTAFTRPASTE    20
  96. #define MATCHPARENS    21
  97. #define TRANSCRIPT    22
  98. #define REVERSEVIDEO    23
  99. #define SPECIALCURSORS    24
  100. #define GRAPHICSSIZE    25
  101. #define SIZETOLERANCE    26
  102. #define KEEPBACKUPCOPY    27
  103. #define NUMDEFAULTS    28
  104.  
  105. @interface PrefAgent (Private)
  106.  
  107. - _revertDefaults;
  108. - _setDefaults;
  109. - _setDialectOpts:(int)dialect;
  110. - _specialFormOpts:(int)buttontag;
  111. - _copyKeywordList;
  112.  
  113. @end
  114.  
  115. static Window *win[NUMBOXWINDOWS];
  116. static NXImage *tiff=NULL;
  117. static NXImage *tiffH=NULL;
  118. static struct _NXDefault defaults[NUMDEFAULTS+1];
  119. static const char *const *languages;
  120. static NXStringTable *stringTable=nil;
  121. static List *keywordList=nil,*oldKeywordList=nil;
  122. static int keywordListVersion=0;
  123. static id theAgent=nil;
  124.  
  125. @implementation PrefAgent
  126.  
  127. + new
  128. {
  129. DEBUG_FUNC1(DEBUGLEVEL);
  130.     if (theAgent==nil)
  131.       {
  132.         NXZone *tempZone;
  133.     extern char *appDirectory;
  134.     const char *appName=[NXApp appName];
  135.     struct _NXDefault defaultdefaults[]=DEFLTS;
  136.     char *temp,*tempdef;
  137.     int i;
  138.     
  139.     DEBUG_ASSERT((appName!=NULL)&&(*appName))
  140.         tempZone = NXCreateZone(vm_page_size, vm_page_size, YES);
  141.         DEBUG_ASSERT(tempZone!=NULL)
  142.         theAgent = self = [super allocFromZone:tempZone];
  143.     agentZone = tempZone;
  144.     NXNameZone(agentZone, PREFZONENAME);
  145.     #ifdef DEBUG
  146.       DEBUG_ASSERT(NXRegisterDefaults(appName, defaultdefaults))
  147.     #else
  148.       NXRegisterDefaults(appName, defaultdefaults);
  149.     #endif
  150.     for(i=0; i<NUMDEFAULTS; i++)
  151.       {
  152.         defaults[i].name = NXCopyStringBufferFromZone(defaultdefaults[i].name, agentZone);
  153.         DEBUG_ASSERT((defaults[i].name!=NULL)&&(*defaults[i].name))
  154.         DEBUG_ASSERT(NXGetDefaultValue(appName, defaultdefaults[i].name))
  155.         defaults[i].value = NXCopyStringBufferFromZone(NXGetDefaultValue(appName, defaultdefaults[i].name), agentZone);
  156.         DEBUG_ASSERT((defaults[i].value!=NULL)&&(*defaults[i].value))
  157.       }
  158.     defaults[NUMDEFAULTS].name = NULL;
  159.     defaults[NUMDEFAULTS].value = NULL;
  160.     stringTable = [[NXStringTable allocFromZone:agentZone] init];
  161.     DEBUG_ASSERT(stringTable!=nil)
  162.     languages = [NXApp systemLanguages];
  163.     if (languages)
  164.       for(i=0; *(languages+i); i++)
  165.         {
  166.           char path[strlen(LANGUAGESTRINGS)+2*strlen(*(languages+i))+strlen(appDirectory)];
  167.  
  168.           if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
  169.           sprintf(path, LANGUAGESTRINGS, appDirectory, *(languages+i), *(languages+i));
  170.           if (!access(path, R_OK))
  171.         {
  172.           #ifdef DEBUG
  173.             DEBUG_ASSERT([stringTable readFromFile:path])
  174.           #else
  175.             [stringTable readFromFile:path];
  176.           #endif
  177.           break;
  178.         }
  179.         }
  180.     keywordList = [[List allocFromZone:agentZone] init];
  181.     DEBUG_ASSERT(keywordList!=nil)
  182.     tempdef = NXCopyStringBuffer(defaults[SPECIALFORMS].value);
  183.     DEBUG_ASSERT((tempdef!=NULL)&&(*tempdef))
  184.     temp = strtok(tempdef,"{}");
  185.     for(i=0; ((temp!=NULL)&&(*temp)); i++)
  186.       {
  187.         char tempkeyword[128];
  188.         int tempde;
  189.     
  190.         sscanf(temp, "%[^,],%i", tempkeyword, &tempde);
  191.         DEBUG_ASSERT((tempkeyword!=NULL)&&(*tempkeyword))
  192.         [keywordList addObject:[[Keyword allocFromZone:agentZone] initTo:tempkeyword with:tempde]];
  193.         temp = strtok(NULL,"{}");
  194.       }
  195.     oldKeywordList = [self _copyKeywordList];
  196.     if (tempdef!=NULL) free(tempdef);
  197.       }
  198.     return theAgent;
  199. }
  200.  
  201. - activateAgent:sender
  202. {
  203. DEBUG_FUNC1(DEBUGLEVEL);
  204.     if (!prefPanel)
  205.       {
  206.         NXRect r={{0,0},{TIFFWIDTH,TIFFWIDTH}};
  207.         int i;
  208.  
  209.         prefPanel = LoadNIB(NIBFILE, theAgent, agentZone);
  210.         DEBUG_ASSERT(prefPanel!=nil)
  211.         [prefPanel useOptimizedDrawing:YES];
  212.         win[CLIENT0] = win0;
  213.         win[CLIENT1] = win1;
  214.         win[CLIENT2] = win2;
  215.         win[CLIENT3] = win3;
  216.         for(i=0; i<NUMBOXWINDOWS; i++)
  217.           {
  218.             DEBUG_ASSERT(win[i]!=nil)
  219.             [win[i] useOptimizedDrawing:YES];
  220.           }
  221.         [theBox setContentView:[win[CLIENT0] contentView]];
  222.         DEBUG_ASSERT([theBox contentView]!=nil)
  223.         tiff = [[NXApp prefAgent] localImage:BUTTONTIFF fromZone:agentZone];
  224.         DEBUG_ASSERT(tiff!=nil)
  225.         tiffH = [[NXApp prefAgent] localImage:BUTTONTIFFH fromZone:agentZone];
  226.         DEBUG_ASSERT(tiffH!=nil)
  227.         for(i=0; i<NUMBOXWINDOWS; i++)
  228.           {
  229.             r.origin.x = i*TIFFWIDTH;
  230.             DEBUG_ASSERT([buttonMatrix cellAt:0 :i]!=nil)
  231.             [[buttonMatrix cellAt:0 :i] setImage:[[NXImage allocFromZone:agentZone] initFromImage:tiff rect:&r]];
  232.             DEBUG_ASSERT([[buttonMatrix cellAt:0 :i] image]!=nil)
  233.             [[buttonMatrix cellAt:0 :i] setAltImage:[[NXImage allocFromZone:agentZone] initFromImage:tiffH rect:&r]];
  234.             DEBUG_ASSERT([[buttonMatrix cellAt:0 :i] altImage]!=nil)
  235.           }
  236.       }
  237.     [self _revertDefaults];
  238.     [prefPanel makeKeyAndOrderFront:self];
  239.     return self;
  240. }
  241.  
  242. - buttonClicked:sender
  243. {
  244. DEBUG_FUNC1(DEBUGLEVEL);
  245.     switch ([[sender selectedCell] tag])
  246.       {
  247.         case REVERTBUTTON: return [self _revertDefaults];
  248.         case CLOSEBUTTON : return [prefPanel performClose:self];
  249.         case OKBUTTON    : return [self _setDefaults];
  250.       }
  251.     DEBUG_ASSERT(NO /* should not get here*/)
  252.     return self;
  253. }
  254.  
  255. - selectPrefs:sender
  256. {
  257. DEBUG_FUNC1(DEBUGLEVEL);
  258.     [theBox setContentView:[win[[[sender selectedCell] tag]] contentView]];
  259.     DEBUG_ASSERT([theBox contentView]!=nil)
  260.     return [theBox display];
  261. }
  262.  
  263. @end
  264.  
  265. @implementation PrefAgent (Delegate)
  266.  
  267. - windowWillClose:sender
  268. {
  269.     int i;
  270.  
  271. DEBUG_FUNC1(DEBUGLEVEL);
  272.     for(i=0; i<NUMBOXWINDOWS; i++)
  273.       {
  274.         win[i] = [win[i] close];
  275.         DEBUG_ASSERT(win[i]==nil)
  276.       }
  277.     [theBox setContentView:nil];
  278.     for(i=0; i<NUMBOXWINDOWS; i++)
  279.       {
  280.         [[[buttonMatrix cellAt:0 :i] image] free];
  281.         [[[buttonMatrix cellAt:0 :i] altImage] free];
  282.       }
  283.     [tiff free];
  284.     [tiffH free];
  285.     prefPanel = nil;
  286.     return self;
  287. }
  288.  
  289. @end
  290.  
  291. @implementation PrefAgent (Localization)
  292.  
  293. - loadLocalNib:(const char *)nibFile owner:(id)owner fromZone:(NXZone *)zone
  294. {
  295.     extern char *appDirectory;
  296.     id retval=nil;
  297.     int i;
  298.  
  299. DEBUG_FUNC1(DEBUGLEVEL);
  300.     if (languages)
  301.       {
  302.         for(i=0; *(languages+i); i++)
  303.           {
  304.             char path[strlen(LANGUAGEDIR)+strlen(*languages)+strlen(appDirectory)+strlen(nibFile)];
  305.  
  306.             if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
  307.             sprintf(path, LANGUAGEDIR, appDirectory, *(languages+i), nibFile);
  308.             if (!access(path, R_OK))
  309.               {
  310.                 retval = [NXApp loadNibFile:path owner:owner withNames:NO fromZone:zone];
  311.                 DEBUG_ASSERT(retval!=nil)
  312.                 break;
  313.               }
  314.           }
  315.       }
  316.     return (retval?:[NXApp loadNibSection:nibFile owner:owner withNames:NO fromZone:zone]);
  317. }
  318.  
  319. - loadLocalMainMenu:(const char *)nibFile
  320. {
  321.     extern char *appDirectory;
  322.     char bpath[strlen(LANGUAGEDIR)+strlen(NATIVE_LANGUAGE)+strlen(appDirectory)+strlen(nibFile)];
  323.     int i;
  324.  
  325. DEBUG_FUNC1(DEBUGLEVEL);
  326.     if (languages)
  327.       for(i=0; *(languages+i); i++)
  328.     {
  329.       char path[strlen(LANGUAGEDIR)+strlen(*(languages+i))+strlen(appDirectory)+strlen(nibFile)];
  330.       sprintf(path, LANGUAGEDIR, appDirectory, *(languages+i), nibFile);
  331.       if (!access(path, R_OK))
  332.         return [NXApp loadNibFile:path owner:NXApp withNames:NO fromZone:[NXApp zone]];
  333.     }
  334.     sprintf(bpath, LANGUAGEDIR, appDirectory, NATIVE_LANGUAGE, nibFile);
  335.     return [NXApp loadNibFile:bpath owner:NXApp withNames:NO fromZone:[NXApp zone]];
  336. }
  337.  
  338. - localImage:(const char *)imageFile fromZone:(NXZone *)zone
  339. {
  340.     extern char *appDirectory;
  341.     id retval=nil;
  342.     int i;
  343.  
  344. DEBUG_FUNC1(DEBUGLEVEL);
  345.     if (languages)
  346.       {
  347.         for(i=0; *(languages+i); i++)
  348.           {
  349.             char path[strlen(LANGUAGEDIR)+strlen(*languages)+strlen(appDirectory)+strlen(imageFile)];
  350.  
  351.             if (!NXOrderStrings((unsigned char *)*languages, (unsigned char *)NATIVE_LANGUAGE, YES, -1, NULL)) break;
  352.             sprintf(path, LANGUAGETIFFS, appDirectory, *(languages+i), imageFile);
  353.             if (!access(path, R_OK))
  354.               {
  355.                 retval = [[NXImage allocFromZone:zone] initFromFile:path];
  356.                 DEBUG_ASSERT(retval!=nil)
  357.                 break;
  358.               }
  359.           }
  360.       }
  361.     return (retval?:[[NXImage allocFromZone:zone] initFromSection:imageFile]);
  362. }
  363.  
  364. const char *doLocalString(const char *key, const char *value)
  365. {
  366.     return ([stringTable valueForStringKey:key]?:(value?:key));
  367. }
  368.  
  369. @end
  370.  
  371. @implementation PrefAgent (Client0)
  372.  
  373. - (BOOL)evaluateAll
  374. {
  375. DEBUG_FUNC1(DEBUGLEVEL);
  376.     return GetBOOLValue(EVALUATEALL);
  377. }
  378.  
  379. - (BOOL)commentOutput
  380. {
  381. DEBUG_FUNC1(DEBUGLEVEL);
  382.     return GetBOOLValue(COMMENTOUTPUT);
  383. }
  384.  
  385. - (BOOL)insertErrors
  386. {
  387. DEBUG_FUNC1(DEBUGLEVEL);
  388.     return GetBOOLValue(INSERTERRORS);
  389. }
  390.  
  391. - (BOOL)transcriptMode
  392. {
  393. DEBUG_FUNC1(DEBUGLEVEL);
  394.     return GetBOOLValue(TRANSCRIPT);
  395. }
  396.  
  397. - (BOOL)autoScroll
  398. {
  399. DEBUG_FUNC1(DEBUGLEVEL);
  400.     return GetBOOLValue(AUTOSCROLL);
  401. }
  402.  
  403. - (BOOL)confirmOnClose
  404. {
  405. DEBUG_FUNC1(DEBUGLEVEL);
  406.     return GetBOOLValue(CONFIRMONCLOSE);
  407. }
  408.  
  409. - setConfirmOnClose:(BOOL)aBool
  410. {
  411.     NXSetDefault([NXApp appName], defaults[CONFIRMONCLOSE].name, (aBool?"YES":"NO"));
  412.     return self;
  413. }
  414.  
  415. - (BOOL)confirmOnQuit
  416. {
  417. DEBUG_FUNC1(DEBUGLEVEL);
  418.     return GetBOOLValue(CONFIRMONQUIT);
  419. }
  420.  
  421. - (BOOL)keepBackupCopy
  422. {
  423. DEBUG_FUNC1(DEBUGLEVEL);
  424.     return GetBOOLValue(KEEPBACKUPCOPY);
  425. }
  426.  
  427. - (int)errorAbort
  428. {
  429. DEBUG_FUNC1(DEBUGLEVEL);
  430.     return atoi(defaults[ERRORABORT].value);
  431. }
  432.  
  433. @end
  434.  
  435. @implementation PrefAgent (Client1)
  436.  
  437. - (BOOL)dblClickMatch
  438. {
  439. DEBUG_FUNC1(DEBUGLEVEL);
  440.     return GetBOOLValue(DBLCLICKMATCH);
  441. }
  442.  
  443. - (BOOL)autoindent
  444. {
  445. DEBUG_FUNC1(DEBUGLEVEL);
  446.     return GetBOOLValue(AUTOINDENT);
  447. }
  448.  
  449. - (BOOL)matchParens
  450. {
  451. DEBUG_FUNC1(DEBUGLEVEL);
  452.     return GetBOOLValue(MATCHPARENS);
  453. }
  454.  
  455. - (BOOL)formatAfterPaste
  456. {
  457. DEBUG_FUNC1(DEBUGLEVEL);
  458.     return GetBOOLValue(FRMTAFTRPASTE);
  459. }
  460.  
  461. @end
  462.  
  463. @implementation PrefAgent (Client2)
  464.  
  465. - formsButtonClicked:sender
  466. {
  467. DEBUG_FUNC1(DEBUGLEVEL);
  468.     return [self _specialFormOpts:[[sender selectedCell] tag]];
  469. }
  470.  
  471. - formsBrowserClick:sender
  472. {
  473.     int row=[[formsBrowser matrixInColumn:BROWSERCOLUMN] selectedRow];
  474. DEBUG_FUNC1(DEBUGLEVEL);
  475.     [[formsField setStringValue:[[keywordList objectAt:row] keyword] at:0] selectTextAt:0];
  476.     [deField setIntValue:[[keywordList objectAt:row] distinguishedElems]];
  477.     return self;
  478. }
  479.  
  480. - (BOOL)isSpecialForm:(const char *)aString
  481. {
  482.     int i;
  483.  
  484. DEBUG_FUNC1(DEBUGLEVEL);
  485.     for(i=0; i<[keywordList count]; i++)
  486.       if (!NXOrderStrings((unsigned char *)aString, (unsigned char *)[[keywordList objectAt:i] keyword], NO, -1, NULL))
  487.         return YES;
  488.     return NO;
  489. }
  490.  
  491. - (int)deForSpecialForm:(const char *)aString
  492. {
  493.     int i;
  494.  
  495. DEBUG_FUNC1(DEBUGLEVEL);
  496.     for(i=0; i<[keywordList count]; i++)
  497.       if (!NXOrderStrings((unsigned char *)aString, (unsigned char *)[[keywordList objectAt:i] keyword], NO, -1, NULL))
  498.         return [[keywordList objectAt:i] distinguishedElems];
  499.     return -1;
  500. }
  501.  
  502. - (int)keywordListVersion
  503. {
  504. DEBUG_FUNC1(DEBUGLEVEL);
  505.     return keywordListVersion;
  506. }
  507.  
  508. @end
  509.  
  510. @implementation PrefAgent (Client3)
  511.  
  512. - dialectChosen:sender
  513. {
  514. DEBUG_FUNC1(DEBUGLEVEL);
  515.     return [self _setDialectOpts:[[sender selectedCell] tag]];
  516. }
  517.  
  518. - (int)schemeDialect
  519. {
  520. DEBUG_FUNC1(DEBUGLEVEL);
  521.     return atoi(defaults[SCHEMEDIALECT].value);
  522. }
  523.  
  524. - (char *)executable
  525. {
  526.     extern char *appDirectory;
  527.  
  528. DEBUG_FUNC1(DEBUGLEVEL);
  529.     switch ([self schemeDialect])
  530.       {
  531.         case SICPDIALECT   :
  532.         case MITDIALECT    :
  533.         case MITDIALECTCOMP: {
  534.                    char *executable=(char *)malloc(strlen(PREFABEXEC)+strlen(appDirectory));
  535.                    DEBUG_ASSERT(executable!=NULL)
  536.                    sprintf(executable, PREFABEXEC, appDirectory); 
  537.                    return executable;
  538.                  }
  539.         case OTHERDIALECT: {
  540.                              char *executable;
  541.                              executable = NXCopyStringBuffer(defaults[EXECUTABLE].value);
  542.                              DEBUG_ASSERT(executable!=NULL)
  543.                              return executable;
  544.                            }
  545.       }
  546.     DEBUG_ASSERT(NO /* should not get here */)
  547.     return NULL;
  548. }
  549.  
  550. - (char *)parameters
  551. {
  552.     extern char *appDirectory;
  553.  
  554. DEBUG_FUNC1(DEBUGLEVEL);
  555.     switch ([self schemeDialect])
  556.       {
  557.         case SICPDIALECT : {
  558.                              char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
  559.                                                        strlen(SICPBAND)+strlen(defaults[SICPPARAMETERS].value));
  560.                              DEBUG_ASSERT(parameters!=NULL)
  561.                              sprintf(parameters, PREFABPARAMS, appDirectory, SICPBAND, defaults[SICPPARAMETERS].value);
  562.                              return parameters;
  563.                            }
  564.         case MITDIALECT  : {
  565.                              char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
  566.                                                   strlen(defaults[MITPARAMETERS].value));
  567.                              DEBUG_ASSERT(parameters!=NULL)
  568.                              sprintf(parameters, PREFABPARAMS, appDirectory, "", defaults[MITPARAMETERS].value);
  569.                              return parameters;
  570.                            }
  571.         case MITDIALECTCOMP: {
  572.                    char *parameters=(char *)malloc(strlen(PREFABPARAMS)+strlen(appDirectory)+
  573.                                  strlen(MITCOMPILER)+strlen(defaults[MITPARAMETERS].value));
  574.                    DEBUG_ASSERT(parameters!=NULL)
  575.                    sprintf(parameters, PREFABPARAMS, appDirectory, MITCOMPILER, defaults[MITPARAMETERS].value);
  576.                    return parameters;
  577.                              }
  578.         case OTHERDIALECT: {
  579.                              char *parameters;
  580.                              parameters = NXCopyStringBuffer(defaults[PARAMETERS].value);
  581.                              DEBUG_ASSERT(parameters!=NULL)
  582.                              return parameters;
  583.                            }
  584.       }
  585.     DEBUG_ASSERT(NO /* should not get here */)
  586.     return NULL;
  587. }
  588.  
  589. @end
  590.  
  591. @implementation PrefAgent (NoClient)
  592.  
  593. - setInterFrame:(const NXRect *)r
  594. {
  595.     char buffer[64];
  596.  
  597. DEBUG_FUNC1(DEBUGLEVEL);
  598.     sprintf(buffer, "{{%f,%f},{%f,%f}}", r->origin.x, r->origin.y, r->size.width, r->size.height);
  599.     NXZoneFree(agentZone, defaults[INTERFRAME].value);
  600.     defaults[INTERFRAME].value = NXCopyStringBufferFromZone(buffer, agentZone);
  601.     DEBUG_ASSERT(defaults[INTERFRAME].value!=NULL)
  602.     NXWriteDefaults([NXApp appName], defaults);
  603.     return self;
  604. }
  605.  
  606. - getInterFrame:(NXRect *)r
  607. {
  608. DEBUG_FUNC1(DEBUGLEVEL);
  609.     sscanf(defaults[INTERFRAME].value, "{{%f,%f},{%f,%f}}", &r->origin.x, &r->origin.y, &r->size.width, &r->size.height);
  610.     return self;
  611. }
  612.  
  613. - setInterFont:(id)aFont
  614. {
  615.     char buffer[16];
  616.  
  617. DEBUG_FUNC1(DEBUGLEVEL);
  618.     NXZoneFree(agentZone, defaults[INTERFONT].value);
  619.     NXZoneFree(agentZone, defaults[INTERFONTSIZE].value);
  620.     defaults[INTERFONT].value = NXCopyStringBufferFromZone([aFont name], agentZone);
  621.     DEBUG_ASSERT(defaults[INTERFONT].value!=NULL)
  622.     sprintf(buffer, "%f", [aFont pointSize]);
  623.     defaults[INTERFONTSIZE].value = NXCopyStringBufferFromZone(buffer, agentZone);
  624.     DEBUG_ASSERT(defaults[INTERFONTSIZE].value!=NULL)
  625.     NXWriteDefaults([NXApp appName], defaults);
  626.     return self;
  627. }
  628.  
  629. - (char *)interFont
  630. {
  631. DEBUG_FUNC1(DEBUGLEVEL);
  632.     return defaults[INTERFONT].value;
  633. }
  634.  
  635. - (float)interFontSize
  636. {
  637. DEBUG_FUNC1(DEBUGLEVEL);
  638.     return atof(defaults[INTERFONTSIZE].value);
  639. }
  640.  
  641. - getDocOrigin:(NXPoint *)p
  642. {
  643. DEBUG_FUNC1(DEBUGLEVEL);
  644.     sscanf(defaults[DOCPOS].value, "{%f,%f}", &p->x, &p->y);
  645.     return self;
  646. }
  647.  
  648. - getDocOffset:(NXPoint *)p
  649. {
  650. DEBUG_FUNC1(DEBUGLEVEL);
  651.     sscanf(defaults[DOCOFFSET].value, "{%f,%f}", &p->x, &p->y);
  652.     return self;
  653. }
  654.  
  655. - (BOOL)reverseVideo
  656. {
  657. DEBUG_FUNC1(DEBUGLEVEL);
  658.     return GetBOOLValue(REVERSEVIDEO);
  659. }
  660.  
  661. - (BOOL)useSpecialCursors
  662. {
  663. DEBUG_FUNC1(DEBUGLEVEL);
  664.     return GetBOOLValue(SPECIALCURSORS);
  665. }
  666.  
  667. - getGraphicsSize:(NXSize *)s
  668. {
  669. DEBUG_FUNC1(DEBUGLEVEL);
  670.     sscanf(defaults[GRAPHICSSIZE].value, "{%f,%f}", &s->width, &s->height);
  671.     return self;
  672. }
  673.  
  674. - getGraphicsTolerance:(NXSize *)s
  675. {
  676. DEBUG_FUNC1(DEBUGLEVEL);
  677.     sscanf(defaults[SIZETOLERANCE].value, "{%f,%f}", &s->width, &s->height);
  678.     return self;
  679. }
  680.  
  681. @end
  682.  
  683. @implementation PrefAgent (Private)
  684.  
  685. - _revertDefaults
  686. {
  687. DEBUG_FUNC1(DEBUGLEVEL);
  688.     [options1Matrix setState:[self evaluateAll] at:EVALALLAT :0];
  689.     [options1Matrix setState:[self commentOutput] at:COMMMENTOUTAT :0];
  690.     [options1Matrix setState:[self insertErrors] at:INSERTERRSAT :0];
  691.     [options1Matrix setState:[self transcriptMode] at:TRANSCRIPTAT :0];
  692.     [options1Matrix setState:[self autoScroll] at:AUTOSCROLLAT :0];
  693.     [options1Matrix setState:[self confirmOnClose] at:CONFCLOSEAT :0];
  694.     [options1Matrix setState:[self confirmOnQuit] at:CONFQUITAT :0];
  695.     [options1Matrix setState:[self keepBackupCopy] at:KEEPBACKUPAT :0];
  696.     [onErrorMatrix setState:YES at:[self errorAbort] :0];
  697.     [options2Matrix setState:[self dblClickMatch] at:DBLCLICKAT :0];
  698.     [options2Matrix setState:[self autoindent] at:AUTOINDENTAT :0];
  699.     [options2Matrix setState:[self matchParens] at:MATCHPARENAT :0];
  700.     [options2Matrix setState:[self formatAfterPaste] at:FORMATPASTEAT :0];
  701.     [dialectMatrix setState:YES at:[self schemeDialect] :0];
  702.     [self _setDialectOpts:[self schemeDialect]];
  703.     [self _specialFormOpts:-1];
  704.     return self;
  705. }
  706.  
  707. - _setDefaults
  708. {
  709.     int i,sizetot;
  710.  
  711. DEBUG_FUNC1(DEBUGLEVEL);
  712.     DEBUG_ASSERT(defaults!=NULL)
  713.     NXZoneFree(agentZone, defaults[EVALUATEALL].value);
  714.     NXZoneFree(agentZone, defaults[COMMENTOUTPUT].value);
  715.     NXZoneFree(agentZone, defaults[INSERTERRORS].value);
  716.     NXZoneFree(agentZone, defaults[TRANSCRIPT].value);
  717.     NXZoneFree(agentZone, defaults[AUTOSCROLL].value);
  718.     NXZoneFree(agentZone, defaults[CONFIRMONCLOSE].value);
  719.     NXZoneFree(agentZone, defaults[CONFIRMONQUIT].value);
  720.     NXZoneFree(agentZone, defaults[KEEPBACKUPCOPY].value);
  721.     defaults[EVALUATEALL].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:EVALALLAT :0] state]?"YES":"NO"), agentZone);
  722.     DEBUG_ASSERT((defaults[EVALUATEALL].value!=NULL)&&(*defaults[EVALUATEALL].value))
  723.     if ([[options1Matrix cellAt:EVALALLAT :0] state])
  724.       [[[[[NXApp mainMenu] findCellWithTag:MENU_ACTIONS] target] findCellWithTag:MENU_ACTIONS_EvalAll] setEnabled:YES];
  725.     else
  726.       [[[[[NXApp mainMenu] findCellWithTag:MENU_ACTIONS] target] findCellWithTag:MENU_ACTIONS_EvalAll] setEnabled:NO];
  727.     defaults[COMMENTOUTPUT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:COMMMENTOUTAT :0] state]?"YES":"NO"), agentZone);
  728.     DEBUG_ASSERT((defaults[COMMENTOUTPUT].value!=NULL)&&(*defaults[COMMENTOUTPUT].value))
  729.     defaults[INSERTERRORS].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:INSERTERRSAT :0] state]?"YES":"NO"), agentZone);
  730.     DEBUG_ASSERT((defaults[INSERTERRORS].value!=NULL)&&(*defaults[INSERTERRORS].value))
  731.     defaults[TRANSCRIPT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:TRANSCRIPTAT :0] state]?"YES":"NO"), agentZone);
  732.     DEBUG_ASSERT((defaults[TRANSCRIPT].value!=NULL)&&(*defaults[TRANSCRIPT].value))
  733.     defaults[AUTOSCROLL].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:AUTOSCROLLAT :0] state]?"YES":"NO"), agentZone);
  734.     DEBUG_ASSERT((defaults[AUTOSCROLL].value!=NULL)&&(*defaults[AUTOSCROLL].value))
  735.     defaults[CONFIRMONCLOSE].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:CONFCLOSEAT :0] state]?"YES":"NO"), agentZone);
  736.     DEBUG_ASSERT((defaults[CONFIRMONCLOSE].value!=NULL)&&(*defaults[CONFIRMONCLOSE].value))
  737.     defaults[CONFIRMONQUIT].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:CONFQUITAT :0] state]?"YES":"NO"), agentZone);
  738.     DEBUG_ASSERT((defaults[CONFIRMONQUIT].value!=NULL)&&(*defaults[CONFIRMONQUIT].value))
  739.     defaults[KEEPBACKUPCOPY].value = NXCopyStringBufferFromZone(([[options1Matrix cellAt:KEEPBACKUPAT :0] state]?"YES":"NO"), agentZone);
  740.     DEBUG_ASSERT((defaults[KEEPBACKUPCOPY].value!=NULL)&&(*defaults[KEEPBACKUPCOPY].value))
  741.     sprintf(defaults[ERRORABORT].value, "%i", [[onErrorMatrix selectedCell] tag]);
  742.     DEBUG_ASSERT((defaults[ERRORABORT].value!=NULL)&&(*defaults[ERRORABORT].value))
  743.     NXZoneFree(agentZone, defaults[DBLCLICKMATCH].value);
  744.     NXZoneFree(agentZone, defaults[AUTOINDENT].value);
  745.     NXZoneFree(agentZone, defaults[MATCHPARENS].value);
  746.     NXZoneFree(agentZone, defaults[FRMTAFTRPASTE].value);
  747.     defaults[DBLCLICKMATCH].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:DBLCLICKAT :0] state]?"YES":"NO"), agentZone);
  748.     DEBUG_ASSERT((defaults[DBLCLICKMATCH].value!=NULL)&&(*defaults[DBLCLICKMATCH].value))
  749.     defaults[AUTOINDENT].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:AUTOINDENTAT :0] state]?"YES":"NO"), agentZone);
  750.     DEBUG_ASSERT((defaults[AUTOINDENT].value!=NULL)&&(*defaults[AUTOINDENT].value))
  751.     defaults[MATCHPARENS].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:MATCHPARENAT :0] state]?"YES":"NO"), agentZone);
  752.     DEBUG_ASSERT((defaults[MATCHPARENS].value!=NULL)&&(*defaults[MATCHPARENS].value))
  753.     defaults[FRMTAFTRPASTE].value = NXCopyStringBufferFromZone(([[options2Matrix cellAt:FORMATPASTEAT :0] state]?"YES":"NO"), agentZone);
  754.     DEBUG_ASSERT((defaults[FRMTAFTRPASTE].value!=NULL)&&(*defaults[FRMTAFTRPASTE].value))
  755.     sprintf(defaults[SCHEMEDIALECT].value, "%i", [[dialectMatrix selectedCell] tag]);
  756.     DEBUG_ASSERT((defaults[SCHEMEDIALECT].value!=NULL)&&(*defaults[SCHEMEDIALECT].value))
  757.     switch ([[dialectMatrix selectedCell] tag])
  758.       {
  759.         case SICPDIALECT: NXZoneFree(agentZone, defaults[SICPPARAMETERS].value);
  760.                           defaults[SICPPARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
  761.               DEBUG_ASSERT((defaults[SICPPARAMETERS].value!=NULL)&&(*defaults[SICPPARAMETERS].value))
  762.               break;
  763.         case MITDIALECT    :
  764.         case MITDIALECTCOMP:NXZoneFree(agentZone, defaults[MITPARAMETERS].value);
  765.                             defaults[MITPARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
  766.                 DEBUG_ASSERT((defaults[MITPARAMETERS].value!=NULL)&&(*defaults[MITPARAMETERS].value))
  767.                 break;
  768.         case OTHERDIALECT:NXZoneFree(agentZone, defaults[EXECUTABLE].value);
  769.                NXZoneFree(agentZone, defaults[PARAMETERS].value);
  770.               defaults[EXECUTABLE].value = NXCopyStringBufferFromZone([executableForm stringValue], agentZone);
  771.               DEBUG_ASSERT((defaults[EXECUTABLE].value!=NULL)&&(*defaults[EXECUTABLE].value))
  772.               defaults[PARAMETERS].value = NXCopyStringBufferFromZone([parametersField stringValue], agentZone);
  773.               DEBUG_ASSERT((defaults[PARAMETERS].value!=NULL)&&(*defaults[PARAMETERS].value))
  774.       }
  775.     NXZoneFree(agentZone, defaults[SPECIALFORMS].value);
  776.     defaults[SPECIALFORMS].value = NXCopyStringBufferFromZone("", agentZone);
  777.     DEBUG_ASSERT((defaults[SPECIALFORMS].value!=NULL)&&(!*defaults[SPECIALFORMS].value))
  778.     sizetot = strlen(defaults[SPECIALFORMS].value)+1;
  779.     [[oldKeywordList freeObjects] free];
  780.     oldKeywordList = keywordList;
  781.     keywordList = [self _copyKeywordList];
  782.     for(i=0; i<[keywordList count]; i++)
  783.       {
  784.         char temp[128];
  785.         sprintf(temp, "{%s,%i}", [[keywordList objectAt:i] keyword], [[keywordList objectAt:i] distinguishedElems]);
  786.     defaults[SPECIALFORMS].value = (char *)NXZoneRealloc(agentZone, defaults[SPECIALFORMS].value, (sizetot+=strlen(temp)+1));
  787.         DEBUG_ASSERT(defaults[SPECIALFORMS].value!=NULL)
  788.     strcat(defaults[SPECIALFORMS].value, temp);
  789.       }
  790.     NXWriteDefaults([NXApp appName], defaults);
  791.     keywordListVersion++;
  792.     return self;
  793. }
  794.  
  795. - _setDialectOpts:(int)dialect
  796. {
  797. DEBUG_FUNC1(DEBUGLEVEL);
  798.     if (dialect<OTHERDIALECT)
  799.       {
  800.         [executableForm setEnabled:NO];
  801.         [executableForm setStringValue:""];
  802.         if (dialect==SICPDIALECT)
  803.           [parametersField setStringValue:defaults[SICPPARAMETERS].value];
  804.         else
  805.           [parametersField setStringValue:defaults[MITPARAMETERS].value];
  806.         [parametersBox setTitle:ADDCMDLINEPARAMS];
  807.       }
  808.     else
  809.       {
  810.         [executableForm setEnabled:YES];
  811.         [executableForm setStringValue:defaults[EXECUTABLE].value];
  812.         [parametersField setStringValue:defaults[PARAMETERS].value];
  813.         [parametersBox setTitle:CMDLINEPARAMS];
  814.       }
  815.     [parametersBox display];
  816.     return self;
  817. }
  818.  
  819. - _specialFormOpts:(int)buttontag
  820. {
  821.     id matrix=[formsBrowser matrixInColumn:0];
  822.     int rowNum=[matrix selectedRow];
  823.  
  824. DEBUG_FUNC1(DEBUGLEVEL);
  825.     switch (buttontag)
  826.       {
  827.         case -1: [formsField setStringValue:NULL];
  828.                  [deField setStringValue:NULL];
  829.          [[keywordList freeObjects] free];
  830.          keywordList = oldKeywordList;
  831.          oldKeywordList = [self _copyKeywordList];
  832.                  [formsBrowser loadColumnZero];
  833.          return self;
  834.     case 0 : if (rowNum<0) break;
  835.              if (NXOrderStrings((unsigned char *)[formsField stringValue],(unsigned char *)[[keywordList objectAt:rowNum] keyword],NO,-1,NULL))
  836.            {
  837.              [[keywordList objectAt:rowNum] setKeyword:(char *)[formsField stringValue]];
  838.              [formsBrowser reloadColumn:0];
  839.            }
  840.                  if ([deField intValue]!=[[keywordList objectAt:rowNum] distinguishedElems])
  841.                [[keywordList objectAt:rowNum] setDistElems:[deField intValue]];
  842.                  [matrix selectCellAt:rowNum :0];
  843.          [self formsBrowserClick:self];
  844.          return self;
  845.     case 1 : if (![self isSpecialForm:[formsField stringValue]])
  846.            {
  847.              [keywordList addObject:[[Keyword allocFromZone:agentZone] initTo:(char *)[formsField stringValue] with:[deField intValue]]];
  848.                      [formsBrowser reloadColumn:0];
  849.                      [matrix selectCellAt:[matrix cellCount]-1 :0];
  850.              [self formsBrowserClick:self];
  851.            }
  852.              return self;
  853.     case 2 : if (rowNum<0) break;
  854.              [[keywordList removeObjectAt:rowNum] free];
  855.                  [deField setStringValue:""];
  856.                  [[formsField setStringValue:"" at:0] selectTextAt:0];
  857.                  [formsBrowser reloadColumn:0];
  858.          return self;
  859.       }
  860.     return self;
  861. }
  862.  
  863. - _copyKeywordList
  864. {
  865.     int i;
  866.     id list;
  867.     list = [[List alloc] init];
  868.     for(i=0; i<[keywordList count]; i++)
  869.       [list addObject:[[keywordList objectAt:i] copy]];
  870.     return list;
  871. }
  872.  
  873. @end
  874.  
  875. @implementation PrefAgent (FormsBrowser)
  876.  
  877. - (int)browser:sender fillMatrix:matrix inColumn:(int)column
  878. {
  879.     int i;
  880.  
  881. DEBUG_FUNC1(DEBUGLEVEL);
  882.     for(i=0; i<[keywordList count]; i--)
  883.       {
  884.         [matrix addRow];
  885.     [[matrix cellAt:i :0] setTag:i];
  886.       }
  887.     return [keywordList count];
  888. }
  889.  
  890. - browser:sender loadCell:aCell atRow:(int)row inColumn:(int)column
  891. {
  892. DEBUG_FUNC1(DEBUGLEVEL);
  893.     if (defaults[SPECIALFORMS].value)
  894.       {
  895.         [aCell setStringValueNoCopy:[[keywordList objectAt:row] keyword]];
  896.         DEBUG_ASSERT(!NXOrderStrings((unsigned char *)[aCell stringValue], (unsigned char *)[[keywordList objectAt:row] keyword], YES, -1, NULL))
  897.         [aCell setLeaf:YES];
  898.         [aCell setLoaded:YES];
  899.       }
  900.     return self;
  901. }
  902.  
  903. @end
  904.  
  905. @implementation Keyword
  906.  
  907. - init
  908. {
  909. DEBUG_FUNC1(DEBUGLEVEL);
  910.     return [self initTo:"" with:-1];
  911. }
  912.  
  913. - initTo:(char *)aString with:(int)anInt
  914. {
  915. DEBUG_FUNC1(DEBUGLEVEL);
  916.     [super init];
  917.     keyword = NXCopyStringBufferFromZone(aString,[self zone]);
  918.     distelems = anInt;
  919.     return self;
  920. }
  921.  
  922. - copy
  923. {
  924.     return [[Keyword allocFromZone:[self zone]] initTo:keyword with:distelems];
  925. }
  926.  
  927. - free
  928. {
  929.     free(keyword);
  930.     return [super free];
  931. }
  932.  
  933. - (char *)keyword
  934. {
  935. DEBUG_FUNC1(DEBUGLEVEL);
  936.     return keyword;
  937. }
  938.  
  939. - (int)distinguishedElems
  940. {
  941. DEBUG_FUNC1(DEBUGLEVEL);
  942.     return distelems;
  943. }
  944.  
  945. - setKeyword:(char *)aString
  946. {
  947. DEBUG_FUNC1(DEBUGLEVEL);
  948.     if (keyword!=NULL) free(keyword);
  949.     keyword = NXCopyStringBufferFromZone(aString,[self zone]);
  950.     DEBUG_ASSERT((keyword!=NULL)&&(*keyword))
  951.     return self;
  952. }
  953.  
  954. - setDistElems:(int)anInt
  955. {
  956. DEBUG_FUNC1(DEBUGLEVEL);
  957.     distelems = anInt;
  958.     return self;
  959. }
  960.  
  961. @end
  962.